package ar.edu.unrn.lia.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "recibo")
public class Recibo extends BaseEntity implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3890925927230929731L;

	public Recibo() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Recibo(Concepto concepto, Double monto, Date fecha, Integer asiento,
			Cliente cliente, String usuario, String propiedad,
			String descripcion) {
		super();
		this.concepto = concepto;
		this.monto = monto;
		this.fecha = fecha;
		this.asiento = asiento;
		this.cliente = cliente;
		this.usuario = usuario;
		this.propiedad = propiedad;
		this.descripcion = descripcion;
	}

	public enum Concepto {
		PCA("Cuota Alquiler"), PPI("Pre Ingreso");

		private String concepto;

		private Concepto(String concepto) {
			this.concepto = concepto;
		}

		@Override
		public String toString() {
			return concepto;
		}
	}

	private Concepto concepto;

	private Double monto;

	private Date fecha;

	private Integer asiento;

	private Cliente cliente;

	private String usuario;

	private String propiedad;

	private String descripcion;

	private List<ReciboItem> items = new ArrayList<ReciboItem>(0);

	@OneToMany(cascade = CascadeType.ALL, mappedBy = "recibo", fetch = FetchType.EAGER)
	public List<ReciboItem> getItems() {
		return items;
	}

	public void setItems(List<ReciboItem> items) {
		this.items = items;
	}

	@ManyToOne
	@JoinColumn(name = "cliente_id", nullable = false)
	@NotNull(message = "{name.notnull}")
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	@Temporal(TemporalType.DATE)
	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	@NotNull(message = "{name.notnull}")
	@Enumerated(EnumType.STRING)
	public Concepto getConcepto() {
		return concepto;
	}

	public void setConcepto(Concepto concepto) {
		this.concepto = concepto;
	}

	@NotNull(message = "{name.notnull}")
	public Double getMonto() {
		return monto;
	}

	public void setMonto(Double monto) {
		this.monto = monto;
	}

	@NotNull(message = "{name.notnull}")
	public Integer getAsiento() {
		return asiento;
	}

	public void setAsiento(Integer asiento) {
		this.asiento = asiento;
	}

	@NotNull(message = "{name.notnull}")
	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	@NotNull(message = "{name.notnull}")
	public String getPropiedad() {
		return propiedad;
	}

	public void setPropiedad(String propiedad) {
		this.propiedad = propiedad;
	}

	@NotNull(message = "{name.notnull}")
	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public void agregarItem(ReciboItem reciboItem) {
		reciboItem.setRecibo(this);
		getItems().add(reciboItem);
	}

}
